iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
0
自我挑戰組

Codewar 進進出出 JS/Ruby系列 第 20

薛丁格的布林值

  • 分享至 

  • xImage
  •  

題目:
[(6 級) Schrödinger's Boolean]
(https://www.codewars.com/kata/5a5f9f80f5dc3f942b002309)
一個值能同時為 truefalse 嗎?
定義 omnibool 讓其在下方的情況下回傳 true
omnibool == true && omnibool == false


Ruby 解法:

omnibool = Object.new

def omnibool.==(bool)
  true
end

心得:
一開始有嘗試過使用邏輯短路的方式解題
omnibool = false && true
omnibool false || true
想當然爾,將值直接指定給變數時沒辦法達成題目的條件

於是告訴自己換個方式思考
剛好最近做 Rails 專案時經常遇到從 params method 得到的回傳值是固定的
如果要對 params 中的內容進行操作,需要將回傳值指定給一個變數

前一陣子上課時龍哥和泰安老師都有提到 Ruby Object Model 這支影片
於是想到可以幫 omnibool 寫個 singleton method 複寫掉原本的 == 判斷方法
並且讓那個 singleton method 的回傳值永遠是 true 便能達成題目條件


JavaScript 解法:

const omnibool = {
  value: true;
  valueOf: () => {
    this.value = !this.value; 
    return this.value
  }
};

心得:
這個題目的 JavaScript 解法有一點點瑕疵
如果調換測試的題目順序的話就會失敗
對此我也沒有更好的解法

之前龍哥介紹過的 __proto__prototype
和 Kuro 大大的 008 讓我對這題有一些頭緒

JavaScript 的 == 的判斷會自動轉型 (超貼心)
而比對物件的情況下,會先透過物件的 valueOf() 方法先求得對應的數值
如果物件沒有 valueOf() 方法的話,則會透過 toString() 轉型再進行比較

也就是說我們可以在 valueOf() 裡面動手腳囉!


上一篇
左邊等於右邊
下一篇
矩陣加法
系列文
Codewar 進進出出 JS/Ruby30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言